<template>
  <div class="app-container">
    <!-- 表格（字段与 timeWarning 完全一致） -->
    <el-table v-loading="loading" :data="caseDetailsList" @selection-change="handleSelectionChange">
      <el-table-column label="案件名称" align="center" prop="casesName" />
      <el-table-column label="案件类别" align="center" prop="casesCategory" />
      <el-table-column label="承办检察官" align="center" prop="contractorName"  :formatter="(row) => '***'" />
      <el-table-column label="公开情况" align="center" prop="publicState" />
      <el-table-column label="流程阶段" align="center" prop="procState" />
      <el-table-column label="受理日期" align="center" prop="acceptDate" />
      <el-table-column label="到期日期" align="center" prop="dueDate" />
      <el-table-column label="审结日期" align="center" prop="conDate" />
      <el-table-column label="案件状态" align="center" prop="casesStatus" />
      <el-table-column label="部门受案号" align="center" prop="deptAcceptMark" />
      <el-table-column label="统一受案号" align="center" prop="uniteMark" />

    <el-table-column label="操作" align="center" width="120">
      <template slot-scope="scope">
        <el-button
          type="primary"
          size="mini"
          @click="handleGenerateReport(scope.row)"
        >
          生成报告
        </el-button>
      </template>
    </el-table-column>
    </el-table>
    <!-- 分页（与 timeWarning 一致） -->
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- 新增：生成报告弹窗 -->
    <el-dialog
      title="生成质量评估报告" :visible.sync="showReportDialog"
      width="60%"
      :before-close="handleDialogClose"
    >
      <div v-if="isGenerating" class="report-loading">
        <p>正在生成报告（大模型推理中...）:</p>
        <pre class="typewriter-effect">{{ reportContent }}</pre>
      </div>
      <div v-else class="report-success">
        <p>报告生成完成！</p>
        <el-button type="primary" @click="downloadReport">下载Word文档</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
// 替换为当前模块的接口（参考 timeWarning 的 import 路径）
import { listCaseDetails } from "@/api/cases/timeWarning"
import { saveAs } from 'file-saver'

export default {
  name: "QualityAssertIndex",
  data() {
    return {
      loading: true,  // 加载状态（与 timeWarning 一致）
      ids: [],        // 选中的 ID 数组
      single: true,   // 单选禁用状态
      multiple: true, // 多选禁用状态
      showSearch: true, // 是否显示搜索表单
      total: 0,       // 总数据量
      caseDetailsList: [], // 案件列表数据（字段与 timeWarning 一致）
      queryParams: {  // 查询参数（与 timeWarning 的 queryParams 字段完全一致）
        pageNum: 1,
        pageSize: 10,
        casesName: null,
        casesCategory: null,
        contractorName: null,
        publicState: null,
        procState: null,
        acceptDate: null,
        dueDate: null,
        conDate: null,
        casesStatus: null,
        deptAcceptMark: null,
        uniteMark: null,
      },
      showReportDialog: false,   // 控制弹窗显示
      reportContent: '',         // 打字机显示的内容
      isGenerating: false,       // 推理状态标记
      finalReportText: ''        // 最终报告内容（用于下载）
    }
  },
  created() {
    this.getList()  // 初始化加载数据（与 timeWarning 一致）
  },
  methods: {
    /** 查询列表（与 timeWarning 的 getList 逻辑一致） */
    getList() {
      this.loading = true
      listCaseDetails(this.queryParams).then(response => {
        this.caseDetailsList = response.rows
        this.total = response.total
        this.loading = false
      })
    },
    /** 多选框选中逻辑（与 timeWarning 一致） */
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id)
      this.single = selection.length!==1
      this.multiple = !selection.length
    },
    /** 导出逻辑（与 timeWarning 一致） */
    handleExport() {
      this.download('quality/qualityassert/export', {  // 替换为当前模块导出路径
        ...this.queryParams
      }, `quality_assert_${new Date().getTime()}.xlsx`)
    },
    async handleGenerateReport(row) {
      this.showReportDialog = true       // 打开弹窗
      this.isGenerating = true           // 标记推理中
      this.reportContent = ''            // 重置显示内容

      // 模拟大模型推理返回的报告文本（实际需调用接口获取）
      const mockReport = `质量评估报告（案件编号：${row.deptAcceptMark}）
      案件名称：${row.casesName}
一、案件质量评查的核心维度与检查点
1. 合法性审查
   办案范围：是否严格限定在法定领域（4+10）或其它新领域（N）。
   职权行使：监督对象是否适格（如行政机关是否具有法定职责）。
   法律依据：检察建议或诉讼请求是否于法有据，是否混淆公益与私益界限。
2. 规范性审查
   程序流程：线索评估、立案审批、调查取证（如勘验、鉴定）、文书送达等流程是否符合《人民检察院公益诉讼办案则》。
   是否超期办案或滥用中止审查程序。
   是否三同案件（同一期限内就同一类违法情形对同一行政机关制发检察建议）
   文书质量：法律文书（如检察建议书、起诉书）是否要素完整、释法说理充分、格式规范。
   司法行为：调查取证是否合法（如违法证据是否排除）、公开听证程序是否规范。
3. 精准性审查
   监督对象：是否精准识别负有监管职责的行政机关或民事侵权主体。
   事实认定：公益损害事实是否证据充分（如损害范围、因果关系）、是否运用技术手段（无人机、数字检察模型）辅助调查。
   检察建议内容：建议事项是否具体可行，是否与后续诉讼请求一致。
4. 实效性审查
   整改效果：行政机关是否全面、及时整改，是否通过现场勘验、专家论证等方式验证整改成效。
   跟进监督：是否对反弹问题定期回访，未整改到位的案件是否依法提起诉讼。
   社会效果：是否通过听证会、志愿者参与、宣传报道提升公众感知度。
5.重点案件审查
   筛选是否为提起诉讼后撤回起诉或者人民法院判决驳回全部诉讼请求的公益诉讼检察案件，为重点评查案件。`

      const finalReportWord = '关于XX案件的质量评查报告\n' +
        '\n' +
        '\n' +
        '第一部分 案件基本情况\n' +
        '案件名称：xx市xx镇人民政府对辖区内xx村旅游区存在村屯垃圾怠于履行监管职责行政公益诉讼 案\n' +
        '案件类别：行政公益诉讼诉前程序案件\n' +
        '承办单位：xx市人民检察院\n' +
        '承办部门：公益诉讼检察部门\n' +
        '承办人：谭xx\n' +
        '（一）案件基本事实\n' +
        '2024年11月，xx市人民检察院通过“益心为公”平台举报信息与“检护旅游旅游资源保护及旅游安全 监督模型”发现，xx镇xx村红色旅游基地存在村屯垃圾、道路两侧固体废物污染环境问题，xx镇人 民政府未依法履行监管职责，致使社会公共利益受损。\n' +
        '（二）诉讼过程及处理结果\n' +
        '.  立案 ：2024年11月17日立案（立案决定书XX检行公立〔2024〕70号）。\n' +
        '.  调查：现场勘验笔录（行公勘〔2024〕23号）确认污染事实，制发磋商函（XX检行公磋 〔2025〕3号）。\n' +
        '  整改：镇政府组织清理行动并建立长效机制，2024年11月21日终结案件（xx检行公终 〔2025〕62号）。\n' +
        '\n' +
        '第二部分 案件质量检查情况\n' +
        '自查与核查情况：\n' +
        '  自查时间 ：2024年11月17日至20日。\n' +
        '  核查内容：程序合规性、证据充分性、法律适用准确性。\n' +
        '  发现问题：文书格式部分不规范（如勘验笔录签名缺失）、整改效果验证未明确采用技术手 段。\n' +
        '  整改措施：补充勘验笔录签名，通过现场回访验证整改效果。\n' +
        '\n' +
        '第三部分 案件质量评查过程\n' +
        '  评查时间 ：2024年11月25日。\n' +
        '  评查方式：交叉评查、案卷审查、整改效果实地核查。\n' +
        '\n' +
        '  评查人员：由市检察院案件管理部、外部专家组成评查组。\n' +
        '  反馈情况：评查结果于2024年11月28日反馈至承办部门。\n' +
        '\n' +
        '\n' +
        '第四部分 评查发现的问题\n' +
        '1. 规范性审查问题\n' +
        '  程序瑕疵：勘验笔录中勘检人签名缺失，违反《人民检察院公益诉讼办案规则》程序要求。\n' +
        '  文书质量：检察建议书未明确整改验收标准，建议事项较笼统。\n' +
        '2. 精准性审查问题\n' +
        '  证据单薄：未使用无人机或数字模型辅助调查，仅依赖现场照片和平台数据。   法律依据引用不全：磋商函未引用《固体废物污染环境防治法》相关条款。\n' +
        '3. 实效性审查问题\n' +
        '  整改验证不足：未通过专家论证或第三方评估确认整改效果，仅以书面回复为依据。 原因分析：\n' +
        '  承办人员对技术取证工具应用不熟练，法律条文检索不全面；\n' +
        '  整改效果评估机制未制度化。\n' +
        '\n' +
        '第五部分 评查认定的等次\n' +
        '等次：合格\n' +
        '理由：\n' +
        '  案件办理基本符合法定程序，核心证据充分，公共利益得到有效维护；   存在文书格式、证据技术应用等轻微问题，已整改完毕；\n' +
        '  未发现重大程序违法或事实认定错误。\n' +
        '\n' +
        '第六部分 相关意见建议\n' +
        '1. 强化技术取证能力：配置无人机、数字模型等工具，提升证据采集精准度。\n' +
        '2. 完善法律检索流程：建立多部门联审机制，确保法律依据引用完整。\n' +
        '3. 规范整改验收标准：引入第三方评估或专家论证，确保整改实效可量化。\n' +
        '4. 加强文书模板培训：定期开展文书制作专项培训，统一格式要求。\n' +
        '\n' +
        '\n' +
        '评查人（评查组）：xx市人民检察院案件质量评查组\n' +
        '日期 ：2024年11月30日\n' +
        '\n' +
        '\n' +
        '\n' +
        '（注：报告内容基于附件3案卷材料及附件2评查标准生成，关键信息已脱敏处理。）'

      // 模拟打字机效果（逐个字符显示）
      let charIndex = 0
      const timer = setInterval(() => {
        if (charIndex < mockReport.length) {
          this.reportContent += mockReport[charIndex]
          charIndex++
        } else {
          clearInterval(timer)
          this.isGenerating = false       // 推理完成
          this.finalReportText = finalReportWord // 保存最终内容
        }
      }, 50) // 每50ms显示一个字符
    },

    /** 下载Word文档 */
    downloadReport() {
      // 创建Word文档（简单文本格式，实际可扩展为更复杂的doc格式）
      const blob = new Blob([this.finalReportText], { type: 'text/plain;charset=utf-8' })
      saveAs(blob, `质量评估报告_${new Date().getTime()}.doc`)
    },

    /** 关闭弹窗时重置状态 */
    handleDialogClose() {
      this.showReportDialog = false
      this.isGenerating = false
      this.reportContent = ''
    }
  }
}
</script>

<style scoped>
/* 新增：打字机效果样式 */
.typewriter-effect {
  font-family: monospace;
  white-space: pre-wrap;
  line-height: 1.6;
  color: #606266;
}
.report-loading, .report-success {
  padding: 20px;
  min-height: 200px;
}
.report-success {
  text-align: center;
}
</style>
